/*
 * @(#)MetalComboBoxButton.java	1.35 03/01/23
 *
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package lookandfeel.Dmetal;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.CellRendererPane;
import javax.swing.DefaultButtonModel;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;

/**
 * JButton subclass to help out MetalComboBoxUI
 * <p>
 * <strong>Warning:</strong> Serialized objects of this class will not be
 * compatible with future Swing releases. The current serialization support is
 * appropriate for short term storage or RMI between applications running the
 * same version of Swing. As of 1.4, support for long term storage of all
 * JavaBeans<sup><font size="-2">TM</font></sup> has been added to the
 * <code>java.beans</code> package. Please see {@link java.beans.XMLEncoder}.
 * 
 * @see MetalComboBoxButton
 * @version 1.35 01/23/03
 * @author Tom Santos
 */
public class MetalComboBoxButton extends JButton
{
	/**
	 * 
	 */
	private static final long serialVersionUID = -2526303716068388036L;

	protected JComboBox comboBox;

	protected JList listBox;

	protected CellRendererPane rendererPane;

	protected Icon comboIcon;

	protected boolean iconOnly = false;

	public final JComboBox getComboBox()
	{
		return comboBox;
	}

	public final void setComboBox(JComboBox cb)
	{
		comboBox = cb;
	}

	public final Icon getComboIcon()
	{
		return comboIcon;
	}

	public final void setComboIcon(Icon i)
	{
		comboIcon = i;
	}

	public final boolean isIconOnly()
	{
		return iconOnly;
	}

	public final void setIconOnly(boolean isIconOnly)
	{
		iconOnly = isIconOnly;
	}

	MetalComboBoxButton()
	{
		super("");
		DefaultButtonModel model = new DefaultButtonModel()
		{
			private static final long serialVersionUID = -6872545225213751532L;

			@Override
			public void setArmed(boolean armed)
			{
				super.setArmed(isPressed() ? true : armed);
			}
		};
		setModel(model);
	}

	public MetalComboBoxButton( JComboBox cb, Icon i, CellRendererPane pane,
			JList list )
	{
		this();
		comboBox = cb;
		comboIcon = i;
		rendererPane = pane;
		listBox = list;
		setEnabled(comboBox.isEnabled());
	}

	public MetalComboBoxButton( JComboBox cb, Icon i, boolean onlyIcon,
			CellRendererPane pane, JList list )
	{
		this(cb, i, pane, list);
		iconOnly = onlyIcon;
	}

	@Override
	public boolean isFocusTraversable()
	{
		return false;
	}

	@Override
	public void setEnabled(boolean enabled)
	{
		super.setEnabled(enabled);

		// Set the background and foreground to the combobox colors.
		if (enabled)
		{
			setBackground(comboBox.getBackground());
			setForeground(comboBox.getForeground());
		}
		else
		{
			setBackground(UIManager.getColor("ComboBox.disabledBackground"));
			setForeground(UIManager.getColor("ComboBox.disabledForeground"));
		}
	}

	@Override
	public void paintComponent(Graphics g)
	{
		boolean leftToRight = MetalUtils.isLeftToRight(comboBox);

		// Paint the button as usual
		super.paintComponent(g);

		Insets insets = getInsets();

		int width = getWidth() - ( insets.left + insets.right );
		int height = getHeight() - ( insets.top + insets.bottom );

		if (( height <= 0 ) || ( width <= 0 )) return;

		int left = insets.left;
		int top = insets.top;
		int right = left + ( width - 1 );
		int bottom = top + ( height - 1 );

		int iconWidth = 0;
		int iconLeft = ( leftToRight ) ? right : left;

		// Paint the icon
		if (comboIcon != null)
		{
			iconWidth = comboIcon.getIconWidth();
			int iconHeight = comboIcon.getIconHeight();
			int iconTop = 0;

			if (iconOnly)
			{
				iconLeft = ( getWidth() / 2 ) - ( iconWidth / 2 );
				iconTop = ( getHeight() / 2 ) - ( iconHeight / 2 );
			}
			else
			{
				if (leftToRight)
					iconLeft = ( left + ( width - 1 ) ) - iconWidth;
				else iconLeft = left;
				iconTop = ( top + ( ( bottom - top ) / 2 ) )
						- ( iconHeight / 2 );
			}

			comboIcon.paintIcon(this, g, iconLeft, iconTop);

			// Paint the focus
			if (comboBox.hasFocus())
			{
				g.setColor(MetalLookAndFeel.getFocusColor());
				g.drawRect(left - 1, top - 1, width + 3, height + 1);
			}
		}

		// Let the renderer paint
		if (!iconOnly && ( comboBox != null ))
		{
			ListCellRenderer renderer = comboBox.getRenderer();
			Component c;
			boolean renderPressed = getModel().isPressed();
			c = renderer.getListCellRendererComponent(listBox, comboBox
					.getSelectedItem(), -1, renderPressed, false);
			c.setFont(rendererPane.getFont());

			if (model.isArmed() && model.isPressed())
			{
				if (isOpaque())
					c.setBackground(UIManager.getColor("Button.select"));
				c.setForeground(comboBox.getForeground());
			}
			else if (!comboBox.isEnabled())
			{
				if (isOpaque())
					c.setBackground(UIManager
							.getColor("ComboBox.disabledBackground"));
				c.setForeground(UIManager
						.getColor("ComboBox.disabledForeground"));
			}
			else
			{
				c.setForeground(comboBox.getForeground());
				c.setBackground(comboBox.getBackground());
			}

			int cWidth = width - ( insets.right + iconWidth );

			// Fix for 4238829: should lay out the JPanel.
			boolean shouldValidate = false;
			if (c instanceof JPanel) shouldValidate = true;

			if (leftToRight)
				rendererPane.paintComponent(g, c, this, left, top, cWidth,
						height, shouldValidate);
			else rendererPane.paintComponent(g, c, this, left + iconWidth, top,
					cWidth, height, shouldValidate);
		}
	}
}
